<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>扁平数组</title>
</head>

<body>
    <script>
        let arr = [1, 2, 3, 4, [1, 2], [3, 4, [5, 6]]]

        // 最优方法，数组自带 flat()
        // 数组扁平方法1，数组的 flat()，传入参数Infinity
        const flatArr1 = (arr) => {
            return arr.flat(Infinity)
        }
        // console.log(flatArr(arr), 'flatArr1');

        // 数组扁平方法2，递归，判断当前便利的item是不是数组，是的话，递归concat加入到新数组中，不是的话直接push到新数组中
        const flatArr2 = (arr) => {
            let newArr = []
            arr.map((item, i) => {
                if (Array.isArray(item)) {
                    newArr = newArr.concat(flatArr2(item))
                    // newArr = newArr.concat(item)
                } else {
                    newArr.push(item)
                }
            })
            return newArr
        }
        // console.log(flatArr2(arr), 'flatArr2');

        // 数组扁平方法3，用数组的reduce()方法，与上一个方法类似，只是不需要新定义一个数组，reduce的第二个参数可以指定初始值
        const flatArr3 = (arr) => {
            return arr.reduce((pre, cur) => {
                return pre.concat(Array.isArray(cur) ? flatArr3(cur) : cur)
                // return pre.concat(cur)
            }, [])
        }
        // console.log(flatArr3(arr), 'flatArr3');

        // 数组扁平方法4，调用数组的toString()方法
        const flatArr4 = (arr) => {
            arr = arr.toString()
            return arr.split(',').map(item => Number(item))
        }
        // console.log(flatArr4(arr), 'flatArr4');

        // 数组扁平化方法5，调用JSON.stringify和正则表达式
        const flatArr5 = (arr) => {
            arr = JSON.stringify(arr).replace(/\[|\]/g, '')
            return arr.split(',').map(item => Number(item))
        }
        // console.log(flatArr5(arr), 'flatArr5');

        // 数组扁平化方法6，调用toString和JSON.parse方法
        const flatArr6 = (arr) => {
            arr = arr.toString()
            return JSON.parse('[' + arr + ']')
        }
        // console.log(flatArr6(arr), 'flatArr6');


        // push方法暂时无法实现
        // const getEvery = (a) => {
        //     // return () => {
        //         for (let i = 0; i < a.length; i++) {
        //             console.log(a.length);
        //             return a[i]
        //         }
        //     // }
        // }

        const flatArr7 = (arr) => {
            return arr.reduce((pre, cur) => {
                pre.push(Array.isArray(cur) ? flatArr7(cur) : cur)
                console.log(cur);

                return pre
            }, [])
        }
        console.log(flatArr7(arr));
    </script>
</body>

</html>